// 文件名：basic_string_view_gateway.cpp
// 目的：使用 std::string_view 对命令行做零拷贝分词，返回指向原字符串的 token 视图列表。
// 实现要点：
//   - splitView：按空格切分 input，跳过连续空格（保证不产生空 token）；
//   - 返回 vector<string_view>，元素直接指向原始输入，不分配新字符串；
//   - main 中在使用完 tokens 后，将结果格式化到 std::string（summary）中，避免 string_view 悬垂。
// 复杂度：O(N) 扫描（N 为输入长度），每个字符被访问有限次。
// 注意事项：
//   - 生命周期：string_view 不拥有数据，必须保证底层字符串在所有视图使用完之前仍然有效；
//   - 分隔规则：当前仅按空格切分，未处理引号/转义等复杂命令行语法（可按需扩展）。
//   - 国际化/多字节：此处按字节分割，若存在多字节空格或更复杂分隔符，需要更完善的解析。

#include <iostream>
#include <sstream>
#include <string>
#include <string_view>
#include <vector>

std::vector<std::string_view> splitView(std::string_view input) {
    std::vector<std::string_view> tokens;
    std::size_t start = 0;
    while (start < input.size()) {
        std::size_t pos = input.find(' ', start);
        if (pos == std::string_view::npos) {
            pos = input.size();
        }
        if (pos > start) {
            tokens.emplace_back(input.substr(start, pos - start));
        }
        start = pos + 1;
    }
    return tokens;
}

int main() {
    std::string commandLine = "deploy --region=ap-southeast-1 --dry-run";
    std::vector<std::string_view> tokens = splitView(commandLine);

    std::cout << "Tokens:\n";
    for (auto token : tokens) {
        std::cout << " - " << token << '\n';
    }

    std::ostringstream oss;
    oss << "Command (" << tokens.size() << " parts) -> ";
    for (auto token : tokens) {
        oss << '[' << token << ']';
    }

    // 持久化结果，避免 string_view 指向的底层数据在 commandLine 生命周期结束后失效
    std::string summary = oss.str();
    std::cout << summary << '\n';
    return 0;
}